package data;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import util.ConnectionManager;

import com.mysql.jdbc.Connection;

import domain.Presupuesto;
import domain.Proyecto;
import domain.Tarea;

public class JDBCTareaDao implements ITareaDao {

	public List<Tarea> selectAllTarea(int pId) {
		List<Tarea> lista = null;
		ConnectionManager cm = ConnectionManager.getInstance();
		Connection con = (Connection) cm.checkOut();
		PreparedStatement sentencia = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM TAREA WHERE PID ='" + pId + "'";
		try {
			lista = new LinkedList<Tarea>();
			sentencia = (PreparedStatement) con.prepareStatement(sql);
			rs = sentencia.executeQuery();
			while (rs.next()) {
				Tarea temp = new Tarea();
				temp.setId(rs.getInt("ID"));
				temp.setNombre(rs.getString("NOMBRE"));
				temp.setDescripcion(rs.getString("DESCRIPCION"));
				temp.setPId(pId);
				temp.setHerramientas(rs.getString("HERRAMIENTAS"));
				temp.setReHumanos(rs.getString("REHUMANOS"));
				temp.setTiempo(rs.getInt("TIEMPO"));
				lista.add(temp);
			}

		} catch (SQLException e) {
			System.out.println("Se ha producido un error en la base de datos");
			// e.printStackTrace();
		} catch (Exception e) {
			System.out.println("Se ha producido al seleccionar tareas");
			// e.printStackTrace();
		} finally {
			try {
				rs.close();
			} catch (SQLException e) {
				System.out
						.println("Fallo al cerrar el resulset de seleccionar tareas");
				// e.printStackTrace();
			}
			try {
				sentencia.close();
			} catch (SQLException e) {
				System.out
						.println("Fallo al cerrar la sentencia de seleccionar tareas");
				// e.printStackTrace();
			}
			cm.checkIn(con);
		}
		return lista;

	}

	public boolean insertTarea(Tarea tarea) {
		boolean ret = false;
		ConnectionManager cm = ConnectionManager.getInstance();
		Connection con = (Connection) cm.checkOut();
		PreparedStatement sentencia = null;
		String sql = "INSERT INTO TAREA (PID,DESCRIPCION,HERRAMIENTAS,REHUMANOS,MATERIALES,TIEMPO,NOMBRE) VALUES (?,?,?,?,?,?,?);";
		try {
			sentencia = con.prepareStatement(sql);
			sentencia.setInt(1, tarea.getPId());
			sentencia.setString(2, tarea.getDescripcion());
			sentencia.setString(3, tarea.getHerramientas());
			sentencia.setString(4, tarea.getReHumanos());
			sentencia.setString(5, tarea.getMateriales());
			sentencia.setInt(6, tarea.getTiempo());
			sentencia.setString(7, tarea.getNombre());

			sentencia.executeUpdate();
			ret = true;

		} catch (SQLException e) {
			System.out.println("Se ha producido un error en la base de datos");

			e.printStackTrace();
		} catch (Exception e) {
			System.out
					.println("Se ha producido un error al insertar una tarea");
			// e.printStackTrace();
		} finally {
			try {
				sentencia.close();
			} catch (SQLException e) {
				System.out
						.println("Fallo al cerrar la sentencia de insertar una tarea");
				ret = false;
				// e.printStackTrace();
			}
			cm.checkIn(con);

		}
		return ret;
	}

	public Tarea selectTarea(int id) {

		Tarea t = new Tarea();
		ConnectionManager cm = ConnectionManager.getInstance();
		Connection con = (Connection) cm.checkOut();
		PreparedStatement sentencia = null;
		ResultSet rs = null;

		String sql = "SELECT * FROM TAREA WHERE ID = '" + id + "'";
		try {

			sentencia = (PreparedStatement) con.prepareStatement(sql);
			rs = sentencia.executeQuery();
			if (rs.next()) {

				t.setId(id);
				t.setDescripcion(rs.getString("DESCRIPCION"));
				t.setHerramientas(rs.getString("HERRAMIENTAS"));
				t.setNombre(rs.getString("NOMBRE"));
				t.setPId(rs.getInt("PID"));
				t.setMateriales(rs.getString("MATERIALES"));
				t.setReHumanos(rs.getString("REHUMANOS"));
				t.setTiempo(rs.getInt("TIEMPO"));

			}

		} catch (SQLException e) {
			System.out.println("Se ha producido un error en la base de datos");
			// e.printStackTrace();
		} catch (Exception e) {
			System.out.println("Se ha producido al seleccionar un proyecto");
			// e.printStackTrace();
		} finally {
			try {
				rs.close();
			} catch (SQLException e) {
				System.out
						.println("Fallo al cerrar el resulset de seleccionar un proyecto");
				// e.printStackTrace();
			}
			try {
				sentencia.close();
			} catch (SQLException e) {
				System.out
						.println("Fallo al cerrar la sentencia de seleccionar un proyecto");
				// e.printStackTrace();
			}
			cm.checkIn(con);
		}
		return t;
	}

	public List<Tarea> selectTareas(int eprid, int pid) {
		List<Tarea> lista = new LinkedList<Tarea>();
		ConnectionManager cm = ConnectionManager.getInstance();
		Connection con = (Connection) cm.checkOut();
		PreparedStatement sentencia = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM TAREA T INNER JOIN PRESUPUESTO P ON T.PID = P.PID WHERE P.EPRID = '"
				+ eprid
				+ "' AND P.ID='"
				+ pid
				+ "' AND T.ID NOT IN (SELECT TID FROM LINEAPRESUPUESTO L WHERE L.EPRID = '"
				+ eprid + "' AND L.PRID = '" + pid + "')";
		try {
			
			sentencia = (PreparedStatement) con.prepareStatement(sql);
			rs = sentencia.executeQuery();
			while (rs.next()) {
				Tarea temp = new Tarea();
				temp.setId(rs.getInt("ID"));
				temp.setNombre(rs.getString("NOMBRE"));
				temp.setDescripcion(rs.getString("DESCRIPCION"));
				temp.setPId(pid);
				temp.setHerramientas(rs.getString("HERRAMIENTAS"));
				temp.setReHumanos(rs.getString("REHUMANOS"));
				temp.setTiempo(rs.getInt("TIEMPO"));
				lista.add(temp);
			}

		} catch (SQLException e) {
			System.out.println("Se ha producido un error en la base de datos");
			// e.printStackTrace();
		} catch (Exception e) {
			System.out.println("Se ha producido al seleccionar tareas");
			// e.printStackTrace();
		} finally {
			try {
				rs.close();
			} catch (SQLException e) {
				System.out
						.println("Fallo al cerrar el resulset de seleccionar tareas");
				// e.printStackTrace();
			}
			try {
				sentencia.close();
			} catch (SQLException e) {
				System.out
						.println("Fallo al cerrar la sentencia de seleccionar tareas");
				// e.printStackTrace();
			}
			cm.checkIn(con);
		}
		return lista;

	}

}
